import express from 'express';
import multer from 'multer';
import axios from 'axios';
import { z } from 'zod';

const router = express.Router();

// 配置文件上传
const upload = multer({
  storage: multer.memoryStorage(),
  limits: {
    fileSize: 5 * 1024 * 1024, // 限制5MB
  },
});

// 配置OpenAI API
const openAIConfig = {
  apiKey: 'gxxx',
  baseURL: 'xxx'
};

// 定义系统提示词
const SYSTEM_PROMPT = `你是一个专业的图像识别助手。请仔细分析用户上传的简笔画图片，不仅要识别出画中的主要内容，还要提供详细的描述。

你的回答必须是一个JSON对象，包含以下字段：
1. results：一个数组，每个元素包含label（识别的内容）和confidence（置信度）字段
2. description：一段详细的文字描述，包括画作的主题、构图特点、线条风格、可能表达的含义等

示例格式：
{
  "results": [{"label": "猫", "confidence": 0.95}],
  "description": "这是一幅可爱的猫咪简笔画。画中的猫咪正在优雅地坐着，尾巴微微上翘。画作采用了流畅的线条，简单而生动地捕捉了猫咪的特征。整体构图简洁而富有表现力。"
}`;

// 验证响应数据结构
const RecognitionResult = z.object({
  results: z.array(
    z.object({
      label: z.string(),
      confidence: z.number(),
    })
  ),
  description: z.string(),
});

// 处理画作识别请求
router.post('/recognize', upload.single('image'), async (req, res) => {
  try {
    if (!req.file) {
      return res.status(400).json({ error: '未找到上传的图片' });
    }

    // 将图片转换为base64格式
    const base64Image = req.file.buffer.toString('base64');

    // 准备请求参数
    const requestParams = {
      model: 'meta-llama/llama-4-scout-17b-16e-instruct',
      messages: [
        {
          role: 'system',
          content: SYSTEM_PROMPT
        },
        {
          role: 'user',
          content: [
            {
              type: 'text',
              text: `这是一幅简笔画的base64编码，请分析这幅画的内容，并以指定的JSON格式返回结果。`
            },
            {
              type: 'image_url',
              image_url: {
                url: `data:image/jpeg;base64,${base64Image}`
              }
            }
          ]
        }
      ],
      temperature: 0.3,
      max_tokens: 300
    };

    console.log('调用OpenAI API，请求参数：', JSON.stringify(requestParams, null, 2));

    // 调用OpenAI API进行图像识别
    const response = await axios.post(
      `${openAIConfig.baseURL}/chat/completions`,
      requestParams,
      {
        headers: {
          'Authorization': `Bearer ${openAIConfig.apiKey}`,
          'Content-Type': 'application/json'
        }
      }
    );

    console.log('OpenAI API响应：', JSON.stringify(response.data, null, 2));

    // 解析API响应
    const content = response.data.choices[0]?.message?.content;
    if (!content) {
      throw new Error('API返回结果为空');
    }

    try {
      // 尝试清理和解析JSON字符串
      const cleanedContent = content
        .trim()
        // 移除markdown代码块标记
        .replace(/^```json\s*|```\s*$/g, '')
        // 移除其他可能的格式化字符
        .replace(/[\u200B-\u200D\uFEFF]/g, '');

      let parsedContent;
      try {
        parsedContent = JSON.parse(cleanedContent);
      } catch (jsonError) {
        console.error('JSON解析错误:', jsonError, '\n原始内容:', content, '\n清理后内容:', cleanedContent);
        throw new Error('AI返回的结果格式不正确');
      }
      
      // 验证数据结构
      try {
        const validatedResponse = RecognitionResult.parse(parsedContent);
        res.json(validatedResponse);
      } catch (validationError) {
        console.error('数据结构验证错误:', validationError);
        throw new Error('AI返回的数据结构不符合要求');
      }
    } catch (error) {
      if (error instanceof Error) {
        throw new Error(`识别结果处理失败: ${error.message}`);
      }
      throw error;
    }
  } catch (error) {
    console.error('识别失败:', error);
    res.status(500).json({ error: '图像识别失败' });
  }
});

export { router };